﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace iNet.Media
{
	/// <summary>
	/// 實作 IFastMediaFormatRecognizer 介面的媒體解碼工作工廠之基底類別。
	/// </summary>
	public abstract class FastMediaDecodeTaskFactory : MediaDecodeTaskFactory, IFastMediaFormatRecognizer
	{
		#region 建構子
		/// <summary>
		/// 初始化新的 FastMediaDecodeTaskFactory 執行個體。
		/// </summary>
		/// <param name="name">工廠名稱，可以為 Null (Visual Basic 為 Nothing)。</param>
		/// <param name="decodingFormat">媒體的解碼格式。</param>
		/// <exception cref="ArgumentNullException">decodingFormat 為 Null (Visual Basic 為 Nothing)。</exception>
		protected FastMediaDecodeTaskFactory(string name, IMediaFormat decodingFormat)
			: base(name, decodingFormat)
		{ }
		#endregion
		#region IsSupportedFormat
		/// <summary>
		/// 確認指定的媒體標頭是否符合支援的媒體格式。
		/// </summary>
		/// <param name="mediaHeader">媒體標頭。</param>
		/// <returns>True 表示媒體標頭符合支援的媒體格式，False 表示不符合。</returns>
		/// <exception cref="ArgumentNullException">mediaHeader 為 Null (Visual Basic 為 Nothing)。</exception>
		public bool IsSupportedFormat(byte[] mediaHeader)
		{
			//確認參數
			if (mediaHeader == null)
				throw new ArgumentNullException("mediaHeader");

			//確認格式
			return this.IsSupportedFormatCore(mediaHeader);
		}
		#endregion
		#region IsSupportedFormatCore
		/// <summary>
		/// 確認是否支援指定資料流中的媒體格式。
		/// </summary>
		/// <param name="stream">提供媒體的資料流。</param>
		/// <returns>True 表示支援指定的來源中的媒體格式，False 表示不支援。</returns>
		protected override bool IsSupportedFormatCore(Stream stream)
		{
			//讀取資料
			byte[] buffer = new byte[this.MediaHeaderSize];
			if (stream.Read(buffer, 0, buffer.Length) < buffer.Length)
				return false;

			//確認標頭
			return this.IsSupportedFormatCore(buffer);
		}
		/// <summary>
		/// 確認指定的媒體標頭是否符合支援的媒體格式。
		/// </summary>
		/// <param name="mediaHeader">媒體標頭。</param>
		/// <returns>True 表示媒體標頭符合支援的媒體格式，False 表示不符合。</returns>
		protected abstract bool IsSupportedFormatCore(byte[] mediaHeader);
		#endregion
		#region MediaHeaderSize
		/// <summary>
		/// 取得媒體標頭的位元組大小。
		/// </summary>
		public abstract int MediaHeaderSize { get; }
		#endregion
	}
}
